﻿// --------------------------------------------------------------------------------------------------------------------
// <copyright file="BaseManager.cs" company="Rabid Dog Labs">
//   Rabid Dog Labs
// </copyright>
// <summary>
//   Base Manager Definition.
// </summary>
// --------------------------------------------------------------------------------------------------------------------

using TeamCommunitySolution.Modules.Base.Requests;
using TeamCommunitySolution.Modules.Base.Responses;

namespace TeamCommunitySolution.Modules.Base
{
    /// <summary>
    /// Base Manager Definition.
    /// </summary>
    public interface BaseManager
    {
        /// <summary>
        /// Registers the user.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Registration Response.</returns>
        RegistrationResponse RegisterUser(RegistrationRequest request);

        /// <summary>
        /// Authenticates the user.
        /// </summary>
        /// <param name="authRequest">The auth request.</param>
        /// <returns>Authentication Response.</returns>
        AuthenticationResponse AuthenticateUser(AuthenticationRequest authRequest);

        /// <summary>
        /// Creates the team.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>A team response instance.</returns>
        TeamResponse CreateTeam(TeamRequest request);

        /// <summary>
        /// Sends the team invite.
        /// </summary>
        /// <param name="inviteRequest">The invite request.</param>
        /// <returns>A team invite response.</returns>
        TeamInviteResponse SendTeamInvite(TeamInviteRequest inviteRequest);

        /// <summary>
        /// Searches the system user.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>A search response.</returns>
        SearchResponse SearchSystemUser(SearchRequest request);

        /// <summary>
        /// Gets the system user by username.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>System User Response</returns>
        SystemUserResponse GetSystemUserByUsername(SystemUserRequest request);

        /// <summary>
        /// Gets the team by id.
        /// </summary>
        /// <param name="fetchRequest">The fetch request.</param>
        /// <returns>Team Response.</returns>
        TeamResponse GetTeamById(TeamFetchRequest fetchRequest);

        /// <summary>
        /// Updates the team.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Team Response.</returns>
        TeamResponse UpdateTeam(TeamUpdateRequest request);

        /// <summary>
        /// Gets the team invite by id.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Team Invite Response.</returns>
        TeamInviteResponse GetTeamInviteById(TeamFetchInviteRequest request);

        /// <summary>
        /// Adds the team member.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Team Response.</returns>
        TeamResponse AddTeamMember(TeamMemberAddRequest request);
    }
}
